<?php
/**
 * 建造者模式
 * 创建型模式
 * 使用多个简单的对象一步一步构建成一个复杂的对象
 */
spl_autoload_register('autoload');

function autoload($class) 
{
    require dirname($_SERVER['SCRIPT_FILENAME']) . '//..//' . str_replace('\\', '/', $class) . '.php';
}

/*============================= 测试 =============================*/
use builder\Director;
use builder\CarBuilder;
use builder\TruckBuilder;
use builder\Car;

$director = new Director(); //实例化导演类
$truckBuilder = new TruckBuilder(); //实例化一个具体的产品类
$newVehicle = $director->build($truckBuilder); //开始构建
var_dump($newVehicle->getPart()); //使用这个类

$carBuilder = new CarBuilder();
$newVehicle = $director->build($carBuilder);
var_dump($newVehicle->getPart());

/*
小结：

应用场景：
要构建一个很复杂的对象，这个对象由多个简单的对象组成（比如复杂车子都有简单的部件：发动机、轮子、车门），
而这些简单的对象由一定的算法构成，且算法相对稳定（比如发动机的制造工艺是固定不变的）
随着需求的变化（今天要造个轿车，明天要造个卡车），会导致这个复杂的对象建造过程发生很大变化（比如建造卡车时需要6个轮子，而建造轿车时只需要4个），
也就是说这些简单的对象的组合会有所不同，此时可以考虑使用建造者模式。

四个角色：
1、产品，如轿车、卡车；2、抽象建造者；3、具体建造者；4、导演（指挥者）。

优点：
1、建造者独立，容易扩展 
2、便于控制细节风险

缺点：
 1、产品必须有共同点，范围有限制
 2、如内部变化复杂，会有很多的建造类

参考：https://www.cnblogs.com/houss/p/11205775.html
     https://learnku.com/docs/php-design-patterns/2018/Builder/1488

建造者模式在Laravel中的应用：
vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php     SQL语句建造者对象
vendor\laravel\framework\src\Illuminate\Database\Query\Expression.php  表达式子对象
vendor\laravel\framework\src\Illuminate\Database\Query\JoinClause.php  联表查询子对象
*/

